/***********************************************
*	名称:管理模块-json数据处理
*	说明:接受外部调用的独立方法,goframe框架专用
*	作者:钱纯净
************************************************/
package in

import (
	"encoding/json"

	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/net/ghttp"
)

func init() {
	g.Server().
		BindStatusHandler(500, func(r *ghttp.Request) {
			body := r.Response.BufferString()
			//正常退出
			if body == ExitOk {
				r.Response.ClearBuffer()
				fnSucc(r, nil)
			}
			//自定义退出
			if len(body) > 7 && body[:7] == `{"Key":` {
				l := ExitModel{}
				err := json.Unmarshal([]byte(body), &l)
				if err == nil {
					r.Response.ClearBuffer()
					l.exit(r)
				}
			}
			//错误退出
			r.Response.ClearBuffer()
			fnFail(r, body)
		})
	g.Server().Group("", ping)
}

//***********************************************分界线**********************************************//
//独立方法包,读取和返回给前端数据

//读取数据
func Read(r *ghttp.Request, v interface{}) {
	readJson(r, v)
}

//整理数据,一般用于返回成功状态码,实际不成功的数据处理
func DealData(code bool, data interface{}, count ...int64) interface{} {
	return dealData(code, data, count...)
}

//返回文件
func ReturnFile(r *ghttp.Request, path string, name ...string) error {
	return returnFile(r.Response.ResponseWriter, path, name...)
}

//返回成功
func Return(r *ghttp.Request, code int, v string) { write(r, code, v) }

//返回成功,状态码200
func Return200(r *ghttp.Request, v string) { write(r, 200, v) }

//返回数据
func Json(r *ghttp.Request, code int, v interface{}) {
	writeJson(r, code, dealData(true, v))
}

//返回数据,状态码200,成功
func Json200(r *ghttp.Request, v interface{}, co ...int64) {
	writeJson(r, 200, dealData(true, v, co...))
}

//返回错误,状态码400,前端参数有误
func Json400(r *ghttp.Request, v interface{}) {
	writeJson(r, 400, dealData(false, v))
}

//返回错误,状态码401,token过期
func Json401(r *ghttp.Request) {
	writeJson(r, 401, dealData(false, "验证不通过"))
}

func Json415(r *ghttp.Request, err error) {
	writeJson(r, 415, dealData(false, err))
}

//返回错误,状态码403,没有权限
func Json403(r *ghttp.Request) { writeJson(r, 403, dealData(false, "没有权限")) }

//返回错误,状态码500,后端出错
func Json500(r *ghttp.Request, v interface{}) {
	writeJson(r, 500, dealData(false, v))
}

//成功
func Succ(r *ghttp.Request, v interface{}, co ...int64) { fnSucc(r, v, co...) }

//失败
func Fail(r *ghttp.Request, v interface{}) { fnFail(r, v) }

//***********************************************分界线**********************************************//

//退出,并校验错误
func Err(v interface{})  { exit(v) }
func Exit(v interface{}) { exit(v) }
func exit(v interface{}) {
	if v == nil {
		panic(ExitOk)
	}
	panic(v)
	//panic(dealDataJson(false, v))
}

//检测错误(遇到错误结束),状态码500,code为Fail
func CheckErr(err error) {
	if err != nil {
		exit(err)
	}
}

//遇到错误退出,状态码200,code为Fail
func CheckErr200(err error) {
	if err != nil {
		exit(err)
		ExitFail200(err)
	}
}

//检测错误(遇到错误结束),状态码400,code为Fail
func CheckErr400(err error) {
	if err != nil {
		Exit400(err)
	}
}

//检测错误(遇到错误结束),状态码500,code为Fail
func CheckErr500(err error) {
	if err != nil {
		Exit500(err)
	}
}

//提前退出200
func Exit200(v interface{}, co ...int64) {
	data := dealData(true, v, co...)
	panic(newExitHttp(200, data))
}

//提前退出200,失败
func ExitFail200(v interface{}, co ...int64) {
	data := dealData(false, v, co...)
	panic(newExitHttp(200, data))
}

//提前退出500
func Exit500(v interface{}) {
	data := dealData(false, v)
	panic(newExitHttp(500, data))
}

//提前退出400
func Exit400(v interface{}) {
	data := dealData(false, v)
	panic(newExitHttp(400, data))
}

//***********************************************分界线**********************************************//

//获取分页
func GetPageSize(r *ghttp.Request) (int, int) {
	return r.GetQueryInt(Page, 1) - 1, r.GetQueryInt(Size)
}

//获取开始结束时间
func GetStartEnd(r *ghttp.Request) (int64, int64) {
	return r.GetQueryInt64(Start), r.GetQueryInt64(End)
}

//读取前端传入的文件
func GetFileBytes(r *ghttp.Request, fileName string) []byte {
	return getFileBytes(r, fileName)
}

//读取前端传入的文件
func GetFileString(r *ghttp.Request, fileName string) string {
	return string(getFileBytes(r, fileName))
}

//保存前端传入文件
//@fileName,文件名称
//@path,文件夹路径
//@newFileName,保存文件名称,可选,暂时不用
func SaveFile(r *ghttp.Request, fileName, path string, newFileName ...string) string {
	return saveFile(r, fileName, path)
}
